package com.test.source;

import java.util.Map;

/**
 * 继承自MapPropertySource的类，用于获取环境变量作为属性源
 */
public class EnvironmentPropertySource extends MapPropertySource{
    // 定义环境变量属性源的名称
    public static final String ENVIRONMENT_PROPERTIES_PROPERTY_SOURCE_NAME = "systemEnvironment";

    /**
     * 默认构造函数，使用默认的环境变量属性源名称
     */
    public EnvironmentPropertySource() {
        super(ENVIRONMENT_PROPERTIES_PROPERTY_SOURCE_NAME, (Map)System.getenv());
    }

    /**
     * 构造函数，允许指定属性源的名称
     * @param name 属性源的名称
     */
    public EnvironmentPropertySource(String name) {
        super(name, (Map)System.getenv());
    }

    /**
     * 重写getProperty方法，以支持获取环境变量
     * 首先尝试按原名获取属性，如果不存在，则尝试获取替代名称的属性
     * 替代名称是将原名中的点替换为下划线，并转换为大写
     * @param name 属性名
     * @return 属性值，如果不存在则返回null
     */
    @Override
    public Object getProperty(String name) {
        Object value = super.getProperty(name);
        if (value != null){
            return value;
        }
        String alternateName = name.replace('.', '_').toUpperCase();
        return super.getProperty(alternateName);
    }

    /**
     * 重写containsProperty方法，以支持检查环境变量是否存在
     * 首先尝试按原名检查属性是否存在，如果不存在，则尝试检查替代名称的属性是否存在
     * @param name 属性名
     * @return 如果属性存在则返回true，否则返回false
     */
    @Override
    public boolean containsProperty(String name) {
        if (super.containsProperty(name)){
            return true;
        }
        String alternateName = name.replace('.', '_').toUpperCase();
        return super.containsProperty(alternateName);
    }
}
